

# 迭代器可以用来存储无限大的序列，这样我们就不用把他一次性放在内存中，
# 而只在需要的时候进行计算。所以，对于读取大文件或者无线集合，最好是使用迭代器。

# 所有的集合都可以迭代
# 可迭代的 Iterable 实现方法 __iter__
# 迭代器   Iterator 实现方法 __next__ __iter__
# 可迭代的对象一定不能是自身的迭代器。也就是说，可迭代的对象必须实现__iter__，但不能实现__next__.
# 另一方面，迭代器应该一直可以迭代。迭代器的__iter__方法应该返回自身。

# 如果一个类想被用于for ... in循环，类似list或tuple那样，就必须实现一个__iter__()方法，
# 该方法返回一个迭代对象，然后，Python的for循环就会不断调用该迭代对象的__next__()方法拿到循环的下一个值，
# 直到遇到StopIteration错误时退出循环。

# class Fib(object):
#     def __init__(self):
#         self.a, self.b = 0, 1 # 初始化两个计数器a，b
#
#     def __iter__(self):
#         return self # 实例本身就是迭代对象，故返回自己
#
#     def __next__(self):
#         self.a, self.b = self.b, self.a + self.b # 计算下一个值
#         if self.a > 100000: # 退出循环的条件
#             raise StopIteration()
#         return self.a # 返回下一个值
